﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BIZMA._controls;
using BIZModel;
using BL.BIZControls;
using System.Configuration;
using System.Web.Security;
using System.Web.Configuration;
using BIZMA._controls.Security;

namespace BIZMA._controls.DemoProject
{
    public partial class Edit_Project : BIZEditControl, IBIZControlDefaultMethods
    {
        #region Default load functions
        public void DefaultListLoad()
        {
            throw new NotImplementedException();
        }

        public void DefaultListLoad(Guid Id, string loadByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditNew()
        {
            NewProject();
        }

        public void DefaultEditNew(Guid Id, string editByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditLoad(Guid Id)
        {
            LoadProject(Id);
        }


        #endregion

        //Skapa objecttyper för att beskriva objekt i generella funktioner
        /// <summary>
        /// ObjectType för projekt. Används där typ av objekt ska beskrivas tex i generella metoder där bara ett id och objettype finns
        /// </summary>
        public const string ObjectTypeProject = "PROJECT";

        //Skapa eventtyper för att beskriva vilket event som sker i generella eventfunktioner
        /// <summary>
        /// EventType för knappen visa rättigheter
        /// </summary>
        public const string EventTypeOpenPermissions = "OPENPERMISSIONS";
        /// <summary>
        /// EventType för knappen projektmedlemmar
        /// </summary>
        public const string EventTypeOpenProjectMembers = "OPENMEMBERS";
        /// <summary>
        /// EventType för kanppen Uppgifter
        /// </summary>
        public const string EventTypeOpenProjectTasks = "OPENTASKS";


        //Properties för att hålla reda på om en dialog kan öppnas eller om den redan är öppen i en underliggande dialog
        public bool CanAddPermissionDialog { get { return ViewState["CanAddPermissionDialog"] != null ? (bool)ViewState["CanAddPermissionDialog"] : true; } set { ViewState["CanAddPermissionDialog"] = value; } }
        public bool CanAddTaskDialog { get { return ViewState["CanAddTaskDialog"] != null ? (bool)ViewState["CanAddTaskDialog"] : true; } set { ViewState["CanAddTaskDialog"] = value; } }
        public bool CanAddMembersDialog { get { return ViewState["CanAddMembersDialog"] != null ? (bool)ViewState["CanAddMembersDialog"] : true; } set { ViewState["CanAddMembersDialog"] = value; } }


        #region Init
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack || !InitLoaded)
            {
                ApplySettings();
                //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
                //Väldigt ovanligt att man laddar listan härifrån då det oftast görs via en annan metod se public void LOAD_BY_SOMETHING_LIST(int someval)
            }

            //Vill man lyssna på specifika event från laddade kontroller ska det reggas här
            //OnInit sker innan så då är Container.ContainedControl alltid null eftersom kontrollerna i denna inte är laddade ännu
            //if (mcSOMESUBLIST.ContainedControl != null)
            //{
            //    ((BIZListControl)mcSOMESUBLIST.ContainedControl).ListSelect += new SelectedChanged(mcSOMESUBLIST_ListSelect);
            //}
        }


        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            //här gör man alla init inställningar tex lägga till eventhandlers och annat som styr sidan
            if (ContainerControl != null)
            {
                //Titel på containerkontrollen
                ContainerControl.Title = "Administrera projekt";
                //Event vid klick på knapparna i containerkontrollen
                ContainerControl.ButtonsClick += new ButtonsHandler(ContainerControl_ButtonsClick);
                //Vilka knappar den här kontrollen använder/vill visa från containerkontrollens knappar
                ContainerControl.ShowButtons(true, true, true, true);

                if (ModalContainerControl != null)
                {
                    ModalContainerControl.Width = 700;
                    ModalContainerControl.Height = 470;
                    ModalContainerControl.FormScrollStyleChanged += new EventHandler(ModalContainerControl_FormScrollStyleChanged);
                }

                //Sätt validation group från Containercontrollen så de blir unika på sidan
                valName.ValidationGroup = ContainerControl.ValGroupSave;
                selCustomer.ReqValidationGroup = ContainerControl.ValGroupSave;

                //Kontrollera om det går att öppna dialoger så det inte har blivit en loop av underliggande dialoger
                //Används i ToggleButtons()
                CanAddMembersDialog = mcProjectMembers.CanAddPopupControl(BIZControl.DEMOProjectMemberList);
                CanAddPermissionDialog = mcPermissions.CanAddPopupControl(BIZControl.ObjectRoleList);
                CanAddTaskDialog = mcTasks.CanAddPopupControl(BIZControl.DEMOProjectTaskList);
            }
            else
            {
                //Om det inte finns någon containercontrol

                //Validation groups för validatorer i kontrollen
                valName.ValidationGroup = "SAVE";
                selCustomer.ReqValidationGroup = "SAVE";
            }

            //Registrera event som sker i kontrollen
            btnPermission.Click += new EventHandler(btnPermission_Click);
            btnProjectMembers.Click += new EventHandler(btnProjectMembers_Click);
            btnTasks.Click += new EventHandler(btnTasks_Click);
        }



        /// <summary>
        /// Utför ändringar i kontrollen utifrån de inställningar som gjorts från föälder till denna kontroll
        /// Funktionen körs automatiskt på onLoad om den inte körts innan
        /// Exempel på hur man använder
        /// Skapa ett event på att kontrollen laddas (men gör det i metoden där kontrollen läggs till eftersom du bara vill trigga detta en gång)
        /// mContainer.BIZControlLoaded += new ControlLoaded(mContainer_BIZControlLoaded);
        /// mContainer.DefaultEditLoad(BIZControl.Employee, EmployeeId);
        /// 
        /// Gör lite inställningar på kontrollen tex:
        /// ((CAST_TO_TYPE)mContainer.ContainedControl).SOME_PROPERTY = SOME_VALUE;
        /// ((CAST_TO_TYPE)mContainer.ContainedControl).ApplySettings();
        /// </summary>
        public void ApplySettings()
        {
            //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
            //Om tabbar används i kontrollen
            //SetTabSize = true; 
            InitLoaded = true;
        }


        #endregion
        #region Container Events
        void ModalContainerControl_FormScrollStyleChanged(object sender, EventArgs e)
        {
            //Sätter samma style (storlek) på FormPart som formscroll så den fyller hela ytan
            oneFormpart.Attributes["style"] = formscroll.Attributes["style"];
        }

        /// <summary>
        /// Triggas vid klick på någon av containerkontrollens knappar
        /// </summary>
        /// <param name="sender">Containerkontrollen</param>
        /// <param name="actionType">Vilken typ av knapp som klickats</param>
        void ContainerControl_ButtonsClick(object sender, ActionType actionType)
        {
            if (actionType == ActionType.Save || actionType == ActionType.SaveClose)
            {
                Save();
            }
            else if (actionType == ActionType.Delete)
            {
                Delete();
            }
        }


        #endregion

        #region Events This Control


        void btnTasks_Click(object sender, EventArgs e)
        {
            if (HandleButtonClick)
            {
                CallHandledButtonClick(this, CurrentId, ObjectTypeProject, EventTypeOpenProjectTasks);
            }
            else
            {
                mcTasks.AddDefaultListLoad(BIZControl.DEMOProjectTaskList, CurrentId,null);
            }
        }

        void btnProjectMembers_Click(object sender, EventArgs e)
        {
             if (HandleButtonClick)
            {
                CallHandledButtonClick(this, CurrentId, ObjectTypeProject, EventTypeOpenProjectMembers);
            }
            else
            {
                mcProjectMembers.AddDefaultListLoad(BIZControl.DEMOProjectMemberList, CurrentId, null);
            }
        }

        void btnPermission_Click(object sender, EventArgs e)
        {
            if (HandleButtonClick)
            {
                CallHandledButtonClick(this, CurrentId, ObjectTypeProject, EventTypeOpenPermissions);
            }
            else
            {
                mcPermissions.AddDefaultListLoad(BIZControl.ObjectRoleList, CurrentId, typeof(BIZModel.Customer).FullName);
            }
        }



        #endregion

        #region Methods this dialog
        
        /// <summary>
        /// Aktiverar/inaktiverar knappar som behöver data eller som inte kan visas pga underliggande dialoger 
        /// </summary>
        private void ToggleButtons()
        {
            //Sätt status om knappen kan visas pga underliggande dialoger
            BaseBL.BtnOpenEnabled(btnPermission, CanAddPermissionDialog, ViewState);
            BaseBL.BtnOpenEnabled(btnProjectMembers, CanAddMembersDialog, ViewState);
            BaseBL.BtnOpenEnabled(btnTasks, CanAddTaskDialog, ViewState);

            //Sätt status om knappen kan visas pga data som krävs
            if (CurrentId != Guid.Empty)
            {
                if (CanAddPermissionDialog)
                {
                    BaseBL.BtnNeedsDataEnabled(btnPermission, true, ViewState);
                }
                if (CanAddMembersDialog)
                {
                    BaseBL.BtnNeedsDataEnabled(btnProjectMembers, true, ViewState);
                }
                if (CanAddTaskDialog)
                {
                    BaseBL.BtnNeedsDataEnabled(btnTasks, true, ViewState);
                }
            }
            else
            {
                if (CanAddPermissionDialog)
                {
                    BaseBL.BtnNeedsDataEnabled(btnPermission, false, ViewState);
                }
                if (CanAddMembersDialog)
                {
                    BaseBL.BtnNeedsDataEnabled(btnProjectMembers, false, ViewState);
                }
                if (CanAddTaskDialog)
                {
                    BaseBL.BtnNeedsDataEnabled(btnTasks, false, ViewState);
                }
            }
        }



        /// <summary>
        /// Kör denna metod när en ny projekt ska skapas
        /// </summary>
        public void NewProject()
        {
            //CurrentProjectId = Guid.Empty;
            LoadProject(Guid.Empty);
        }

        /// <summary>
        /// Kör denna metod när en projekt ska ändras/visas
        /// </summary>
        /// <param name="customerId">Kunden som ska laddas</param>
        public void LoadProject(Guid customerId)
        {
            InitLoaded = true;
            CurrentId = customerId;

            if (CurrentId != Guid.Empty)
            {
                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.Project project = ent.Projects.FirstOrDefault(q => q.ProjectId == CurrentId);

                txtName.Text = project.Name;
                txtDescription.Text = project.Description;
                selCustomer.SelectedId = project.CustomerId;
            }
            else
            {
                txtName.Text = "";
                txtDescription.Text = "";
                selCustomer.SelectedId = Guid.Empty;
            }

            ToggleButtons();
        }

        /// <summary>
        /// Spara
        /// </summary>
        private void Save()
        {
            //SAVE
            if (Page.IsValid)
            {
                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.Project project = null;

                if (CurrentId == Guid.Empty)
                {
                    CurrentId = Guid.NewGuid();

                    project = BIZModel.Project.CreateProject(CurrentId, txtName.Text,selCustomer.SelectedId);
                    project.Description = txtDescription.Text;

                    ent.Projects.AddObject(project);
                    ent.SaveChanges();
                }
                else
                {
                    project = ent.Projects.FirstOrDefault(q => q.ProjectId == CurrentId);

                    project.Name = txtName.Text;
                    project.Description = txtDescription.Text;
                    project.CustomerId = selCustomer.SelectedId;

                    ent.SaveChanges();
                }

                //Ändra aktivering av knappar efter sparning / eller kör load metoden 
                ToggleButtons();
            }
        }

        private void Delete()
        {
            if (CurrentId != Guid.Empty)
            {
                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.Project project = ent.Projects.FirstOrDefault(q => q.ProjectId == CurrentId);
                ent.DeleteObject(project);
                ent.SaveChanges();
            }

        }






        #endregion

        #region Sub dialog events

        #endregion




    }
}